﻿using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SubstrateHelper.Data;
using SubstrateHelper.Models;
using SubstrateHelper.Services;
using Microsoft.AspNetCore.Hosting;

namespace SubstrateHelper
{
    public class Init
    {
        
        public static async Task DoSomeInit(IWebHost host)
        {
            //注册编码页，使之能够读取GB2312编码
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);



            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                //await InitRolesAndRoleClaims(services);
                //await InitUsersAndUserRoles(services);                
                //await InitInputSuggestings(services);
                //await InitProductionEntitiesAndInventories(services);
                //await InitIngredients(services);
                //await InitProcessesAndParameters(services);
                await InitAdmin(services);

                //IMsgObserver msgObserver = services.GetRequiredService<IMsgObserver>();
                //msgObserver.Register();

            }


        }


        private static async Task InitAdmin(IServiceProvider services)
        {
            var Db = services.GetRequiredService<SubstrateHelperDbContext>();

            if (Db.Users.Count() > 0)
            {
                return;
            }

            //用户
            var userManager = services.GetRequiredService<UserManager<IdentityUser>>();
            
            string userId="DatabaseManager";
            string phone = "17700542790";
            await userManager.CreateAsync(new IdentityUser
            {
                Id = userId,
                //Email = strs[0],
                UserName = phone,
                PhoneNumber =phone,
                PhoneNumberConfirmed = true,
                LockoutEnabled = true
            }, userId+phone);

            //角色
            string role = "数据库管理员";
            Db.Roles.Add(new IdentityRole
            {
                Name = role,
                NormalizedName = role,
                Id =role,
                ConcurrencyStamp = Guid.NewGuid().ToString()
            });

            //用户角色
            Db.UserRoles.Add(new IdentityUserRole<string>()
            {
                UserId = userId,
                RoleId = role
            });

            await Db.SaveChangesAsync();

        }

        //private static async Task InitProcessesAndParameters(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.Processes.Count() > 0)
        //    {
        //        return;
        //    }

            //    try
            //    {
            //        using (FileStream fs = new FileStream("./Init/Processes.csv", FileMode.Open))
            //        {
            //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
            //            string line;

            //            line = reader.ReadLine();//跳过第一行
            //            while ((line = reader.ReadLine()) != null)
            //            {
            //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
            //                if (strs.Count() >= 8)
            //                {
            //                    context.Processes.Add(new Models.Process
            //                    {
            //                        //ProcessName,InputEntityName,OutputEntityName,InputUnit,OutputUnit,IsDiscarded,InProcessInsepctionMinutes
            //                        ProcessName = strs[0],
            //                        InputEntityName = strs[1],
            //                        OutputEntityName = strs[2],
            //                        InputUnit = strs[3],
            //                        OutputUnit = strs[4],
            //                        IsDiscarded = bool.Parse(strs[5]),
            //                        //InProcessInsepctionMinutes = int.Parse(strs[6])
            //                        LaborCost = double.Parse(strs[6]),
            //                        SequenceID=int.Parse(strs[7])                                
            //                    }) ;                            
            //                }
            //            }
            //            context.SaveChanges();
            //        }
            //    }
            //    catch(Exception ex)
            //    {
            //        int a = 0;
            //    }

            //    ///////////////////////////////////////////////////////////////////////////////////
            //    if (context.ProcessParameters.Count() > 0)
            //    {
            //        return;
            //    }

            //    try
            //    {
            //        using (FileStream fs = new FileStream("./Init/ProcessParameters.csv", FileMode.Open))
            //        {
            //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
            //            string line;

            //            line = reader.ReadLine();//跳过第一行

            //            while ((line = reader.ReadLine()) != null)
            //            {
            //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
            //                if (strs.Count() >= 16)
            //                {
            //                    context.ProcessParameters.Add(new Models.ProcessParameter
            //                    {
            //                        //ProcessName,StepName,Name,InspectionType,ValueType,InputSuggestingCategory,InputSuggestingType,Unit,WritMask,ReadMask,RemoveMask,IsRecordInitDiscarded,IsParameterDiscarded,InspectionMask
            //                        ProcessName = strs[0],
            //                        StepName=strs[1],
            //                        Name=strs[2],
            //                        InspectionType=UInt32.Parse(strs[3]),
            //                        ValueType= (Models.ValueType)Enum.Parse(typeof(Models.ValueType), strs[4]),                                
            //                        InputSuggestingCategory =strs[5],
            //                        InputSuggestingType= (Models.InputSuggestingType)Enum.Parse(typeof(Models.InputSuggestingType), strs[6]),
            //                        Unit =strs[7],
            //                        WriteMask=UInt32.Parse(strs[8]),
            //                        ReadMask = UInt32.Parse(strs[9]),
            //                        RemoveMask = UInt32.Parse(strs[10]),
            //                        InitDiscarded=bool.Parse(strs[11]),
            //                        IsDiscarded=bool.Parse(strs[12]),
            //                        InspectionMask=UInt32.Parse(strs[13]),
            //                        MsgToSend= strs[14],
            //                        SequenceID=int.Parse(strs[15])
            //                    });
            //                }
            //            }
            //            context.SaveChanges();
            //        }
            //    }
            //    catch (Exception ex)
            //    {
            //        int a = 0;
            //    }
            //}

        //    private static async Task InitUsersAndUserRoles(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.Users.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {
        //        var userManager = services.GetRequiredService<UserManager<IdentityUser>>();
        //        IdentityResult result;
        //        IdentityUser user;

        //        //添加用户
        //        using (FileStream fs = new FileStream("./Init/Users.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 3)
        //                {
        //                    result = await userManager.CreateAsync(new IdentityUser
        //                    {
        //                        Id = strs[0],
        //                        //Email = strs[0],
        //                        UserName = strs[1],
        //                        PhoneNumber = strs[1],
        //                        PhoneNumberConfirmed = true,
        //                        LockoutEnabled = true
        //                    }, strs[2]);
        //                }
        //            }
        //        }


        //        //添加角色及分配角色
        //        using (FileStream fs = new FileStream("./Init/UserRoles.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 2)
        //                {
        //                    context.UserRoles.Add(new IdentityUserRole<string>()
        //                    {
        //                        UserId = strs[0],
        //                        RoleId = strs[1]
        //                    });
        //                }
        //            }

        //        }
        //        context.SaveChanges();



        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }
        //}

        //private static async Task InitRolesAndRoleClaims(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.Roles.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {


        //        //添加角色
        //        using (FileStream fs = new FileStream("./Init/Roles.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 1)
        //                {
        //                    context.Roles.Add(new IdentityRole { 
        //                        Name = strs[0], 
        //                        NormalizedName = strs[0], 
        //                        Id = strs[0], 
        //                        ConcurrencyStamp = Guid.NewGuid().ToString() });
        //                }
        //            }


        //            context.SaveChanges();//先保存一下，以备角色分配使用




        //        }

        //        //为角色添加Claims
        //        using (FileStream fs = new FileStream("./Init/RoleClaims.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;


        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 3)
        //                {
        //                    //RoleId,ClaimType,ClaimValue
        //                    context.RoleClaims.Add(new IdentityRoleClaim<string>()
        //                    {
        //                        RoleId = strs[0],
        //                        ClaimType = strs[1],
        //                        ClaimValue = strs[2]
        //                    });
        //                }
        //            }

        //            context.SaveChanges();//先保存一下，以备角色分配使用

        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }


        //}


        //private static async Task InitProductionEntitiesAndInventories(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.ProductionEntities.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {
        //        using (FileStream fs = new FileStream("./Init/ProductionEntities.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 5)
        //                {
        //                    context.ProductionEntities.Add(new Models.ProductionEntity
        //                    {

        //                        Name = strs[0],
        //                        Suppiler = strs[1],
        //                        ProductionEntityType = (Models.ProductionEntityType)Enum.Parse(typeof(Models.ProductionEntityType), strs[2]),
        //                        QuantityUnit = strs[3],
        //                        IsDiscarded = bool.Parse(strs[4])
        //                    }); ;
        //                }
        //            }
        //            context.SaveChanges();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }

        //    ///////////////////////////////////////////////////////////////////////////////////
        //    if (context.Inventories.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {
        //        using (FileStream fs = new FileStream("./Init/Inventories.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 3)
        //                {
        //                    context.Inventories.Add(new Models.Inventory
        //                    {
        //                        ProductionEntityName=strs[0],
        //                        ID=strs[1],
        //                        Quantity=double.Parse(strs[2]),
        //                        //QuantityUnit=strs[3],
        //                        //IsDiscarded = bool.Parse(strs[3])
        //                    });
        //                }
        //            }
        //            context.SaveChanges();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }
        //}

        //private static async Task InitInputSuggestings(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.InputSuggestings.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {
        //        using (FileStream fs = new FileStream("./Init/InputSuggestings.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 4)
        //                {
        //                    var suggesting = new Models.InputSuggesting();
        //                    suggesting.Category = strs[0];
        //                    suggesting.SuggestingString = strs[1];
        //                    try
        //                    {
        //                        suggesting.SuggestingDouble = double.Parse(strs[2]);
        //                    }
        //                    catch
        //                    {
        //                        suggesting.SuggestingDouble = 0;
        //                    }
        //                    try
        //                    {
        //                        suggesting.SuggestingDateTime = DateTime.Parse(strs[3]);
        //                    }
        //                    catch
        //                    {
        //                        suggesting.SuggestingDateTime = DateTime.MinValue;
        //                    }
        //                    context.InputSuggestings.Add(suggesting);                            
        //                }
        //            }
        //            context.SaveChanges();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }


        //}

        //private static async Task InitIngredients(IServiceProvider services)
        //{
        //    var context = services.GetRequiredService<SubstrateHelperDbContext>();
        //    if (context.Ingredients.Count() > 0)
        //    {
        //        return;
        //    }

        //    try
        //    {
        //        using (FileStream fs = new FileStream("./Init/Ingredients.csv", FileMode.Open))
        //        {
        //            StreamReader reader = new StreamReader(fs, System.Text.Encoding.GetEncoding("gb2312"));
        //            string line;

        //            line = reader.ReadLine();//跳过第一行
        //            while ((line = reader.ReadLine()) != null)
        //            {
        //                string[] strs = line.Split(new char[] { ',' }, StringSplitOptions.None);
        //                if (strs.Count() >= 4)
        //                {
        //                    context.Ingredients.Add(new Models.Ingredient
        //                    {
        //                        FormulaName=strs[0],
        //                        ProductionEntityName=strs[1],
        //                        Quantity=double.Parse(strs[2]),
        //                        //Unit=strs[3],
        //                        IsDiscarded=bool.Parse(strs[3])
        //                    });
        //                }
        //            }
        //            context.SaveChanges();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        int a = 0;
        //    }


        //}

    }
}
